<?php

namespace app\index\controller;

use think\Controller;
use app\index\model\Index as IndexModel;
use think\Request;
use think\Session;
use think\Db;
use verify\SendCode ;

class Index extends Controller
{
    // 首页
    public function index()
    {
        // 分类
        $cate = Db::name('category')->field(['id', 'cate_name'])->order('id')->select();
        // 用户未登录的推荐页笔记查询笔记数据
        $data = Db::name('user_note')->field(['id', 'title', 'thumb', 'praise','collection'])->where('top', '1')->orderRaw('rand()')->select();
        // 用户登录的推荐
        // 用户id
        $session = input('session.');
        // 如果用户已登录
        if (!empty($session)) {
            $id = Session::get('data.id');
            // 获取该用户的兴趣爱好
            $interesting = Db::name('user_info')->field('interesting')->where('uid', $id)->find();
//            halt($interesting);
            // 用户登录的推荐
            $recommend = Db::name('user_note')->field(['id', 'title', 'thumb', 'praise','collection'])->where('tags_id', 'in', $interesting)->whereOr('top', 1)->orderRaw('rand()')->select();
            $this->assign('recommend', $recommend);
        }
//
        // 加载首页
        return view('index/index', [
            'data' => $data,
            'cateList' => $cate,
        ]);
    }


    // 分类显示内容
    public function tab($category)
    {
        // 分类
        $cate = Db::name('category')->field(['id', 'cate_name'])->order('id')->select();

        // 笔记信息
        $data = Db::field(['note.id,note.title,note.thumb,note.praise,note.collection'])
            ->table(['2B_user_note' => 'note', '2B_note_type' => 'type', '2B_category' => 'c'])
            ->where('c.id', $category)
            ->where('type.cat_id=c.id')
            ->where('note.tags_id=type.id')
            ->orderRaw('rand()')
            ->select();

        // 加载首页
        return view('index/tab', [
            'data' => $data,
            'cateList' => $cate,
            'id' => $category
        ]);
    }

    // 登录/注册
    public function login()
    {
//        dump($login);
        // 加载登录/注册
        return view('index/login');
    }

    // 登录AJAX处理
    public function logindo()
    {
        // 查所有用户
        $info = db('user')->field('tel,email')->select();
        // 查传递过来的数据
        $user = input('post.');

        // 判断
        if (key($user) == 'name'){
            // 判断名字
            $name = $this->in_array_r($user['name'],$info);
            if (!$name){
                return json(['tel'=> 'false','title'=>'您的账号输入有误,请重新输入']);
            }else{
                $data = db('user')->where('tel','eq',$user['name'])->whereOr('email','eq',$user['name'])->select();
                unset($data[0]['password']);
                Session::set('data',$data[0]);

                return json(['tel'=> 'true']);
            }

        } else if (key($user) == 'password'){
            // 判断密码

            // 判断传过来的密码是否为空
            if (array_key_exists('password',$user) == false){
                return json(['password'=> 'false','title'=>'您的密码空,请重新输入']);
            }else{
                // 模型处理
                $ModelIndex = new IndexModel($user);
                // 获取id
                $uid = Session::get('data')['id'];
//              // 模型层验证密码
                $pwd = $ModelIndex->checkPass($uid,$user['password']);
                if ($pwd){
                    return json(['password'=> 'true']);
                }else{
                    return json(['password'=> 'false','title'=>'您的密码输入有误,请重新输入']);
                }
            }
        }else{
            return json(['error'=> 'false','title'=>'您的信息输入有误!!']);
        }

        // 查询账号的相关信息
        $data = db('user')->where('tel', 'eq', $user['name'])->select();

        // 验证验证码
        if (!captcha_check($user['captcha'])) {
            return json('captcha');
        };

    }


    // 登录验证
    public function captcha()
    {
        // 获取传过来的验证码
        $captcha = input('post.captcha');
        // 判断
        if (captcha_check($captcha)){
            return true;
        }else{
            return json(['captcha'=> 'false','title'=>'您的验证码输入有误,请重新输入']);
        }

    }



    // 注册AJAX处理
    public function register()
    {
        // 接收数据
        $register = input('post.');
//        halt($register);
        // 判断传过来的值
        if (key($register) == 'tel'){
            // 判断是否为空
            if (array_key_exists('tel',$register) == false){
                return json(['tel'=> 'false','title'=>'您的账号不能为空!!!']);
            }else {
                // 判断手机格式是否正确
                $tel = preg_match('/^1[34578]\d{9}$/',$register['tel']);
                if (!$tel){
                    return json(['tel'=> 'false','title'=>'您的账号格式不正确,请重新输入']);
                }

                // 判断该手机号是否被注册过
                $user = db('user')->where('tel','eq',$register['tel'])->select();
                if (!empty($user)){
                    return json(['tel'=> 'false','title'=>'您输入的账号已存在,请重新输入']);
                }

                return json(['tel'=> 'true']);
            }

        }else if (key($register) == 'email'){

            // 判断是否为空
            if (array_key_exists('email',$register) == false){
                return json(['email'=> 'false','title'=>'您的邮箱不能为空!!!']);
            }else {
                // 判断该邮箱是否被注册过
                $user = db('user')->where('email','eq',$register['email'])->select();
                if (!empty($user)){
                    return json(['email'=> 'false','title'=>'您输入的邮箱已存在,请重新输入']);
                }

                // 判断手机格式是否正确
                $tel = preg_match('/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/',$register['email']);
                if (!$tel){
                    return json(['email'=> 'false','title'=>'您的邮箱格式不正确,请重新输入']);
                }
                return json(['email'=> 'true']);
            }
        }else if (key($register) == 'password') {
            // 使用验证器验证
            $result = $this->validate(
                [
                    'password' => $register['password'],
                ],
                [
                    'password' => ['require', 'alphaNum', 'min' => 6, 'max' => 20],
                ]);
            if (true !== $result) {
                // 验证失败 输出错误信息
                return json(['password' => 'false', 'title' => '密码必须为数字或字母,最少六位,最长二十位']);
            }else{
                return json(['password'=> 'true']);
            }
        }else if (key($register) == 'captcha'){

            // 判断验证码是否相等
                if ($register['captcha'] == Session::get('SMS')){
                    return json(['captcha' => 'true']);
                }else{
                    return json(['captcha' => 'false', 'title' => '您的验证码输入有误请重新输入']);
                }
        }else{
            return json(['error'=> 'false','title'=>'您的信息输入有误!!']);
        }
    }

    // 短信验证码
    public function SMS()
    {
//        sendTemplateSMS()
        // 获取手机号
        $tel = input('post.tel');
        // 获取随机数
        $random = mt_rand(100000,999999);
        $this->getSMS($tel,$random);
        Session::set('SMS',$random);
        return true;
    }

    // 调用发送短信请求
    protected function getSMS($tel,$random)
    {
        $Rest  = new SendCode();
        $Rest->sendTemplateSMS($tel,array($random,'10'),"1");
    }


    // 注册最后处理
    public function getLogin()
    {
        //获取数据
        $user = input('post.');
        //获取model对象
        $IndexModel = new IndexModel($user);
        //对密码进行盐值加密
        $user['password'] = $IndexModel->setPass($user['password']);
        // 设置用户唯一凭证
        $user['voucher'] = $IndexModel->setVoucher();
        // 删除数组多余元素
        unset($user['repassword']);
        unset($user['captcha']);

        // 添加数据库并获取自增ID
        $result = Db::name('user')->insertGetId($user);

        // 判断是否添加成功
        if ($result > 0){
            // 注册成功添加数据到附表
            Db::name('user_info')->data('uid',$result)->insert();
            // 注册成功后删除验证码
            Session::delete('SMS');
            // 查找存储的用户
            $data = Db::name('user')->where('id','eq',$result)->find();
            // 删除多余数据密码
            unset($data['password']);
            // 存储session
            Session::set('data',$data);
            return $this->success('恭喜您注册成功了!', url('index/Index/index'));
        }else{
            return $this->error('对不起,注册失败了!!!');
        }
    }

    // 登录最后处理
    public function getReg()
    {

        // 返回到首页
        return $this->redirect(url('index/Index/index'));
    }


    // 登出页面
    public function logout()
    {

        Session::clear();
        return $this->redirect(url('index/Index/index'));
    }
    
    
    // 搜索
    public function search()
    {
        // 获取要搜索的值
        $value = Request::instance()->get('keyworld');
        // 搜索
        $data = db('user_note')->field(['id', 'title', 'thumb', 'praise','collection'])->whereLike('title','%'.$value.'%')->select();
        return $this->fetch('index/search',[
            'data' => $data,
            'title' => $value.'相关'
        ]);
    }

    // 遍历多重数组
    private function in_array_r($needle, $haystack, $strict = false)
    {
        foreach ($haystack as $item) {
            if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && $this->in_array_r($needle, $item, $strict))) {
                return true;
            }
        }

        return false;
    }

}
